home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / fxwindow.arc / FXWINDOW.PAS < prev    next >
Pascal/Delphi Source File  |  1991-04-28  |  7KB  |  243 lines

  1. Unit FXWindow;
  2.  
  3. Interface
  4.  
  5.    Uses DOS,CRT;
  6.  
  7.    Type ScreenType = Record
  8.                         Pos : Array[1..2000] Of Record
  9.                                                    Ch : Char;
  10.                                                    Attrib : Byte;
  11.                                                 End;
  12.                      End;
  13.  
  14.    Var Screen : ScreenType Absolute $B800:0000;
  15.        SaveScreen : Array[0..9] Of ScreenType;
  16.        CurrentWindow : Integer;
  17.        WindowCursor : Array[0..9] Of Record
  18.                                         CursorX : Integer;
  19.                                         CursorY : Integer;
  20.                                      End;
  21.        WindowPos : Array[0..9] Of Record
  22.                                       PosX1 : Integer;
  23.                                       PosY1 : Integer;
  24.                                       PosX2 : Integer;
  25.                                       PosY2 : Integer;
  26.                                    End;
  27.  
  28.    Procedure Cursor(OnOff : Boolean);
  29.    Procedure Color(FG,BG : Integer);
  30.    Procedure DrawWindow(X1,Y1,X2,Y2,FG,BG : Integer;Shadow : Boolean);
  31.    Procedure MoveWindow(X,Y : Integer;Shadow : Boolean);
  32.    Procedure RemoveWindow;
  33.    Procedure SaveStartUpWindow;
  34.    Procedure UnInitWindow;
  35.  
  36. Implementation
  37.  
  38.    Function XYValue(X,Y : Integer) : Integer;
  39.  
  40.       Begin
  41.          XYValue := (((Y-1)*80)+X);
  42.       End;
  43.  
  44.    Procedure Cursor(OnOff : Boolean);
  45.  
  46.    Var Regs : Registers;
  47.  
  48.       Begin
  49.          If OnOff Then
  50.             Begin
  51.                If Mem[0:$449] = 7 Then
  52.                   Regs.CX := $0C0D
  53.                Else
  54.                   Regs.CX := $0607
  55.             End
  56.          Else
  57.             Begin
  58.                Regs.CX := $2000;
  59.             End;
  60.          Regs.AX := $0100;
  61.          Intr($10,Regs);
  62.       End;
  63.  
  64.    Procedure Color(FG,BG : Integer);
  65.  
  66.       Begin
  67.          TextColor(FG);
  68.          TextBackGround(BG);
  69.       End;
  70.  
  71.    Procedure ClearBlock(X1,Y1,X2,Y2,FG,BG : Integer);
  72.  
  73.       Begin
  74.          Color(FG,BG);
  75.          Window(X1,Y1,X2,Y2);
  76.          ClrScr;
  77.          Window(1,1,80,25);
  78.       End;
  79.  
  80.    Procedure DrawWindow(X1,Y1,X2,Y2,FG,BG : Integer;Shadow : Boolean);
  81.  
  82.    Var I : Integer;
  83.  
  84.       Begin
  85.          CurrentWindow := CurrentWindow + 1;
  86.          If CurrentWindow = 11 Then
  87.             Begin
  88.                Color(15,4);
  89.                Write  (#7,'Error 1: Too Many Windows!');
  90.                CurrentWindow := 10;
  91.                Exit;
  92.             End;
  93.          SaveScreen[CurrentWindow] := Screen;
  94.          With WindowCursor[CurrentWindow] Do
  95.             Begin
  96.                CursorX := WhereX;
  97.                CursorY := WhereY;
  98.             End;
  99.          ClearBlock(X1,Y1,X2,Y2,FG,BG);
  100.          For I := X1+1 To X2-1 Do
  101.             Begin
  102.                Screen.Pos[XYValue(I,Y1)].Ch := '═';
  103.                Screen.Pos[XYValue(I,Y2)].Ch := '═';
  104.             End;
  105.          For I := Y1+1 To Y2-1 Do
  106.             Begin
  107.                Screen.Pos[XYValue(X1,I)].Ch := '║';
  108.                Screen.Pos[XYValue(X2,I)].Ch := '║';
  109.             End;
  110.          Screen.Pos[XYValue(X1,Y1)].Ch := '╔';
  111.          Screen.Pos[XYValue(X2,Y1)].Ch := '╗';
  112.          Screen.Pos[XYValue(X1,Y2)].Ch := '╚';
  113.          Screen.Pos[XYValue(X2,Y2)].Ch := '╝';
  114.          Window(X1+1,Y1+1,X2-1,Y2-1);
  115.          GotoXY(1,1);
  116.          With WindowPos[CurrentWindow] Do
  117.             Begin
  118.                PosX1 := X1+1;
  119.                PosY1 := Y1+1;
  120.                PosX2 := X2-1;
  121.                PosY2 := Y2-1;
  122.             End;
  123.          If Shadow Then
  124.             Begin
  125.                For I := X1+2 To X2+2 Do Screen.Pos[XYValue(I,Y2+1)].Attrib := 8;
  126.                For I := Y1+1 To Y2+1 Do
  127.                   Begin
  128.                      Screen.Pos[XYValue(X2+1,I)].Attrib := 8;
  129.                      Screen.Pos[XYValue(X2+2,I)].Attrib := 8;
  130.                   End;
  131.             End;
  132.       End;
  133.  
  134.    Procedure MoveWindow(X,Y : Integer;Shadow : Boolean);
  135.  
  136.    Var I,J,K,M,N,O : Integer;
  137.        HoldScreen : ScreenType;
  138.  
  139.       Begin
  140.          If CurrentWindow = 0 Then
  141.             Begin
  142.                Color(15,4);
  143.                Write  (#7,'Error 3: No Windows To Move!');
  144.                Exit;
  145.             End;
  146.          HoldScreen := SaveScreen[CurrentWindow];
  147.          K := (WindowPos[CurrentWindow].PosX2 - WindowPos[CurrentWindow].PosX1)+2;
  148.          M := (WindowPos[CurrentWindow].PosY2 - WindowPos[CurrentWindow].PosY1)+2;
  149.          N := WindowPos[CurrentWindow].PosX1-1;
  150.          O := WindowPos[CurrentWindow].PosY1-1;
  151.          For J := 0 To M Do
  152.             Begin
  153.                For I := 0 To K Do
  154.                   Begin
  155.                      HoldScreen.Pos[XYValue(X+I,Y+J)].Ch := Screen.Pos[XYValue(N+I,O+J)].Ch;
  156.                      HoldScreen.Pos[XYValue(X+I,Y+J)].Attrib := Screen.Pos[XYValue(N+I,O+J)].Attrib;
  157.                   End;
  158.             End;
  159.          If Shadow Then
  160.             Begin
  161.                For I := X+2 To X+K+2 Do HoldScreen.Pos[XYValue(I,Y+M+1)].Attrib := 8;
  162.                For I := Y+1 To Y+M+1 Do
  163.                   Begin
  164.                      HoldScreen.Pos[XYValue(X+K+1,I)].Attrib := 8;
  165.                      HoldScreen.Pos[XYValue(X+K+2,I)].Attrib := 8;
  166.                   End;
  167.             End;
  168.          With WindowPos[CurrentWindow] Do
  169.             Begin
  170.                PosX1 := X+1;
  171.                PosY1 := Y+1;
  172.                PosX2 := X+K-1;
  173.                PosY2 := Y+M-1;
  174.                Window(PosX1,PosY1,PosX2,PosY2);
  175.             End;
  176.          GotoXY(WindowCursor[CurrentWindow].CursorX,WindowCursor[CurrentWindow].CursorY);
  177.          Screen := HoldScreen;
  178.       End;
  179.  
  180.    Procedure RemoveWindow;
  181.  
  182.       Begin
  183.          CurrentWindow := CurrentWindow - 1;
  184.          If CurrentWindow = - 1 Then
  185.             Begin
  186.                Color(15,4);
  187.                Write  (#7,'Error 2: No Windows To Remove!');
  188.                CurrentWindow := 0;
  189.                Exit;
  190.             End;
  191.          With WindowPos[CurrentWindow] Do
  192.             Begin
  193.                Window(PosX1,PosY1,PosX2,PosY2);
  194.             End;
  195.          Screen := SaveScreen[CurrentWindow+1];
  196.          With WindowCursor[CurrentWindow] Do
  197.             Begin
  198.                GotoXY(CursorX,CursorY);
  199.             End;
  200.       End;
  201.  
  202.    Procedure SaveStartUpWindow;
  203.  
  204.       Begin
  205.          SaveScreen[0] := Screen;
  206.          With WindowCursor[0] Do
  207.             Begin
  208.                CursorX := WhereX;
  209.                CursorY := WhereY;
  210.             End;
  211.       End;
  212.  
  213.    Procedure UnInitWindow;
  214.  
  215.       Begin
  216.          With WindowPos[0] Do
  217.             Begin
  218.                Window(PosX1,PosY1,PosX2,PosY2);
  219.             End;
  220.          Screen := SaveScreen[0];
  221.          With WindowCursor[0] Do
  222.             Begin
  223.                GotoXY(CursorX,CursorY);
  224.             End;
  225.       End;
  226.  
  227. Begin
  228.    CurrentWindow := 0;
  229.    SaveScreen[0] := Screen;
  230.    With WindowCursor[0] Do
  231.       Begin
  232.          CursorX := WhereX;
  233.          CursorY := WhereY;
  234.       End;
  235.    With WindowPos[0] Do
  236.       Begin
  237.          PosX1 := 1;
  238.          PosY1 := 1;
  239.          PosX2 := 80;
  240.          PosY2 := 25;
  241.       End;
  242. End.
  243.